#include <stdio.h>
#include "stuinfo.h"
#include "stucomp.h"
void Gp(int grade, double *g) // 根据学生的百分制成绩计算每门课的4分制绩点
{
	double gp = 0;
	if (grade < 0 || grade > 100)
		gp = -1;
	else if (grade >= 90)
		gp = 4.0;
	else if (grade >= 85)
		gp = 3.7;
	else if (grade >= 82)
		gp = 3.3;
	else if (grade >= 78)
		gp = 3.0;
	else if (grade >= 75)
		gp = 2.7;
	else if (grade >= 72)
		gp = 2.3;
	else if (grade >= 68)
		gp = 2.0;
	else if (grade >= 64)
		gp = 1.5;
	else if (grade >= 60)
		gp = 1.0;
	else
		gp = 0;
	*g = gp;
}
void Gpa(int n, struct Stu stu[]) // 分别计算每个学生门课的4分制加权绩点（平均绩点）
{
	int i = 0;
	for (i = 0; i < n; i++)
	{
		int j = 0;
		double gps = 0;		// （学分1* 绩点1）+（学分2* 绩点2）...
		double credits = 0; // 学分1 + 学分2...
		for (j = 0; j < N; j++)
		{
			Gp(stu[i].grades[j].score, &stu[i].grades[j].gp);
			gps += stu[i].grades[j].gp * stu[i].grades[j].credit;
			credits += stu[i].grades[j].credit;
		}
		stu[i].gpa = gps / credits * 1.0; // 计算加权绩点
	}
}
void Sort(int n, struct Stu stu[]) // 按照学生的4分制加权绩点倒排
{
	int i = 0;
	int j = 0;
	for (i = 0; i < n - 1; i++)
	{
		for (j = i + 1; j < n; j++)
		{
			if (stu[j].gpa > stu[i].gpa)
			{
				struct Stu temp = stu[i]; // 结构体数据也可用临时变量交换
				stu[i] = stu[j];
				stu[j] = temp;
			}
		}
	}
}
int Write_file(struct Stu stu[], int n) // 将学生4分制加权绩点倒排数据写入到stusorted.dat文件中
{
	FILE *fp = fopen("stusorted.dat", "w");
	if (fp == NULL)
	{
		perror("fopen");
		return 0;
	}
	int i = 0;
	fprintf(fp, "     id    name   GPA\n");
	for (i = 0; i < n; i++)
	{
		fprintf(fp, "%s %s  %.2lf\n", stu[i].id, stu[i].name, stu[i].gpa); // 写入文件中
	}
	fclose(fp);
	fp = NULL;
	return 1;
}
int main()
{
	struct Stu stu1[M] = {0};
	int n = 0;			 // n为学生人数,由文件stuscore.dat中样本个数决定
	Read_file(stu1, &n); // 从文件stuscore.dat中读取数据
	Show(stu1, n);		 // 在屏幕上显示
	Gpa(n, stu1);		 // 分别计算每个学生N门课的4分制加权绩点（平均绩点）
	Sort(n, stu1);		 // 按照学生的4分制加权绩点倒排
	Write_file(stu1, n); // 将学生4分制加权绩点倒排数据写入到stusorted.dat文件中
	return 0;
}
